package ru.niir.goodfil.utils.validation;

/**
 * Структура хранит результат проверки на возсожность сохранения объекта в БД
 */
public class CreateCheckResult
{
    /**
     * Класс, для которого выполнялась проверка
     */
    private final Class klass;

    /**
     * Результат проверки (можно создать объект или нет)
     */
    private final boolean result;

    /**
     * Сообщение (опционально)
     */
    private final String msg;

    /**
     * Конструктор
     * @param klass класс, для которого выполнялась проверка
     * @param result результат проверки
     * @param msg сообщение (опционально)
     */
    public CreateCheckResult(Class klass, boolean result, Object msg)
    {
        assert klass != null;

        this.klass = klass;
        this.result = result;
        this.msg = String.valueOf(msg);
    }

    /**
     * Статический конструктор создает структуру проверки на возможность создания объекта для _успешной_ проверки
     * @param klass класс, для которого выполняется проверка
     * @return результат проверки
     */
    public static CreateCheckResult Ok(Class klass)
    {
        return new CreateCheckResult(klass, true, null);
    }

    /**
     * Статический конструктор создает структуру проверки на возможность создания объекта для _не успешной_ проверки
     * @param klass класс, для которого выполняется проверка
     * @return результат проверки
     */
    public static CreateCheckResult Error(Class klass, Object msg)
    {
        return new CreateCheckResult(klass, false, msg);
    }

    /**
     * Возвращает true, если результат проверки отрицателен
     * @return true, если результат проверки отрицателен
     */
    public boolean isError()
    {
        return !result;
    }

    /**
     * Возвращает true, если результат проверки положителен
     * @return true, если результат проверки положителен
     */
    public boolean isOk()
    {
        return result;
    }

    /**
     * Возвращает сообщение, содержащее информацию о проверке
     * @return сообщение, содержащее информацию о проверке
     */
    public String getMsg()
    {
        return msg;
    }

    /**
     * Возвращает класс, для которого выполнялась проверка
     * @return класс, для которого выполнялась проверка
     */
    public Class getKlass()
    {
        return klass;
    }
}
